class Solution:
    def isBipartite(self, graph: List[List[int]]) -> bool:
        
        """
        题目不难 主要是两个类交替变换 如何写的简洁优雅？
        参考题解的写法
        
        需要有标志位 防止重复计算 
        同时还要有区分两类的标志
        这三类可以同时进行标记，原先我直接使用集合set反而不够简洁
        """
        N = len(graph)
        uncolored, red, green = 0, 1, 2
        state = [ uncolored ]*N # 各个节点的状态 0，1，2 分别为  未分类  1类 2类
        
        queue = collections.deque()
        """
        bug2：可以两个二分图放在一起也是二分图 尽管是两块图
        所以不能像debug1那样对没有分类的节点就直接不处理了
        """
        for i in range(N):
            if state[i] != uncolored:
                continue
                
            queue.append(i)
            state[i] = red
            while queue:
                node = queue.popleft()
                nextColor = (green if state[node]==red else red) # 增加一个标志位来判断 更具前一轮的类别来判断下一轮的类别
                """
                比如 单纯的两类轮换 把nextColor写为全局变量
                nextColor = (green if nextColor==red else red)
                """
                for neighbor in graph[node]:
                    if state[neighbor] == uncolored:
                        state[neighbor] = nextColor
                        queue.append(neighbor)
                    elif state[neighbor] != nextColor:
                        return False
        
        # for s in state: # 有孤立点
        #     if s == uncolored:
        #         return False
        """
        bug1：一个二分图加入一个孤立点，孤立点并入任何一个集合还是能是满足二分图条件
        """
        
        return True
        
        